package com.example.xcService.pojo.channels.impl;

import com.alibaba.fastjson.JSONObject;
import com.example.xcService.pojo.channels.ChannelResult;
import com.example.xcService.pojo.channels.ChannelService;
import com.example.xcService.pojo.tool.HttpTool;
import lombok.extern.slf4j.Slf4j;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.LinkedHashMap;
import java.util.Map;

/*
* 彦浩
* */
@Slf4j
public class Plugin_ECARD_P023 implements ChannelService {

    @Override
    public ChannelResult QueryBalance(JSONObject apiConfig) {
        System.out.println("成功调用了QueryBalance");
        return  ChannelResult.success("success");
    }

    /*
        UserId	是	string	会员身份标识（我方提供）(测试编号：211394897)
        TimesTamp	是	long	Unix时间戳（毫秒，13位，我们系统目前不会做时间偏差校验）
        ProductNumber	是	string	产品编号（我方提供，大小写敏感）(测试编号：PLM102589（自动成功）、PLM102618（自动失败）)
        Count	是	int	购买数量（正整数）
        UserOrderId	是	string	会员订单号（幂等，在我们系统同一个会员相同的UserOrderId只会存在一笔，网络问题或异常后可以立即重试）
        Account	是	string	被充值账号（加油卡直充：中石化或中石油卡号；京东E卡直充：手机号或京东账户名，当使用手机号模式直充时：填手机号，当使用京东账号名直充时：填京东账户名。需要注意的是如果使用京东E卡手机号直充，需要前置调用手机验证码接口）
        ClientIP	是	string	订单来源IP（如果没有可传商户自己的IP地址或 127.0.0.1）
        Sign	是	string	签名 MD5(UserId+Count+NotifyUrl+Account+ClientIP+UserOrderId+ProductNumber+TimesTamp+AppSecret) 转大写
     */
    @Override
    public ChannelResult Submit(JSONObject apiConfig, Map<String, Object> data) {

        try {
            long timeMillis = System.currentTimeMillis();
            LinkedHashMap<String, Object> params = new LinkedHashMap<>();
            params.put("UserId",apiConfig.getString("UserId"));
            params.put("Count",1);
            params.put("Account",data.get("AccountVal"));
            params.put("ClientIP","120.26.223.111");
            params.put("UserOrderId",data.get("ChannelOrderCode"));
            params.put("ProductNumber",data.get("SUPProductId"));
            params.put("TimesTamp",timeMillis);

            String appSecret = apiConfig.getString("AppSecret");
            String submitUrl = apiConfig.getString("SubmitUrl");
            String sign = generateSignature(params, appSecret);
            params.put("Sign",sign);

            String req = HttpTool.HttpPost2(submitUrl, params);
            JSONObject jsonObject = JSONObject.parseObject(req);
            // jsonObject.getString("")
            String code = jsonObject.getString("Code");
            String msg = jsonObject.getString("Msg");
            if (code.equals("0")) {
                return ChannelResult.IN_PROCESS("提单成功，权益充值中");
            }
            if (code.equals("-170") || code.equals("-180") ) {
                return ChannelResult.IN_PROCESS("权益充值中");
            }
            if (code.equals("-999")) {
                return ChannelResult.error(msg);
            }
            return ChannelResult.FAILED(msg);
        }catch (Exception e) {
            e.printStackTrace();
            log.error("彦浩提交订单接口错误：",e);
            return  ChannelResult.error("彦浩提交订单接口错误");
        }
    }

    /*  UserId	是	string	会员身份标识（我方提供）
        TimesTamp	是	long	Unix时间戳（毫秒）
        UserOrderId	是	string	会员部订单号
        Sign	是	string	签名
    */

    @Override
    public ChannelResult Query(JSONObject apiConfig, Map<String, Object> data) {

       try {
           long timeMillis = System.currentTimeMillis();
           LinkedHashMap<String, Object> queryParams = new LinkedHashMap<>();
           queryParams.put("UserId",apiConfig.getString("UserId"));
           queryParams.put("TimesTamp",timeMillis);
           queryParams.put("UserOrderId",data.get("ChannelOrderCode"));

           String appSecret = apiConfig.getString("AppSecret");
           String queryUrl = apiConfig.getString("QueryUrl");
           String sign = generateSignature(queryParams, appSecret);

           queryParams.put("Sign",sign);

           String req = HttpTool.HttpPost2(queryUrl, queryParams);
           JSONObject jsonObject = JSONObject.parseObject(req);
           String code = jsonObject.getString("Code");
           String msg = jsonObject.getString("Msg");
           String reqData = jsonObject.getString("Data");
           if (code.equals("0")) {
               JSONObject dataObj = JSONObject.parseObject(reqData);
               String orderStatus = dataObj.getString("OrderStatus");
               if (orderStatus.equals("2")) {
                   return ChannelResult.success("充值成功");
               }
               if (orderStatus.equals("1")) {
                   return ChannelResult.IN_PROCESS("订单处理中");
               }
               if (orderStatus.equals("3")) {
                   return ChannelResult.FAILED("充值失败");
               }
               return  ChannelResult.error("需要人工核实并处理订单");
           }
           return ChannelResult.error(msg);
       }catch (Exception e) {
           e.printStackTrace();
           log.error("彦浩提交订单接口错误：",e);
           return  ChannelResult.error("彦浩提交订单接口错误");
       }
    }


    @Override
    public ChannelResult Notify(JSONObject apiConfig, Map<String, Object> data) {
        System.out.println("成功调用了Notify");
        return  ChannelResult.success("success");
    }

    public static String generateSignature(LinkedHashMap<String, Object> params, String appSecret) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            sb.append(entry.getValue());
        }
        sb.append(appSecret);
        String message = sb.toString();
        System.out.println(message);
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(message.getBytes());
            StringBuilder hexString = new StringBuilder();
            for (byte b : digest) {
                hexString.append(String.format("%02X", b));
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }




}
